<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta
      name="viewport"
      content="width=
  , initial-scale=1.0"
    />
    <title>Document</title>
  </head>
  <body>
    <div id="test"></div>
    <div id="test1"></div>
    <div id="test2"></div>

    <script
      src="https://unpkg.com/react@16/umd/react.development.js"
      crossorigin
    ></script>
    <script
      src="https://unpkg.com/react-dom@16/umd/react-dom.development.js"
      crossorigin
    ></script>
    <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
  </body>
  <script type="text/babel">
    /*
    1.虚拟DOM中的Key的作用：
         1.1  简单的说：key是虚拟DOM对象的标识，在更新显示时key起着极其重要的作用
         1.2  详细的说：当状态中的数据发生变化时，react会根据【新数据】生成【新的虚拟DOM】,随后React进行【新虚拟DOM】于【旧虚拟DOM】的diff比较，比较规则如下：
      a.旧虚拟Dom中找到了与心虚你dom相同的key:
        1.1若虚拟dom中内容没变，直接使用之前的真实dom
        1.2若虚拟dom中内容变了，则生成新的真实dom，随后替换掉页面中之前的真实dom
      b.旧虚拟dom中未找到与新虚拟dom相同的key
         根据数据创建新的真实dojm，随后渲染到页面
    2.用index作为key 可能会引发的问题：
          1.若对数据进行：逆序添加、逆序删除等破坏顺序操作；
                        会产生没有必要的真实dom更新==》界面效果没有问题，但效率低
          2.如果结构中还包含输入类的Dom:
                         会产生错误DOM更新===>界面有问题
          3.注意！如果不存在对数据的逆序添加、逆序删除等破坏顺序操作
                 仅用于渲染列表用于展示，使用Index作为key时没有问题的
    3.开发中如何选择key?:
               1.最好使用每条数据额唯一标识作为key,比如id、手机号、身份证号、学号等唯一值
               2.如果确定只是见到你的展示数据，用index也是可以的
    */
    class Person extends React.Component {
      state = {
        persons: [
          { id: 1, name: "小李", age: 18 },
          { id: 2, name: "小张", age: 19 },
        ],
      };
      add = () => {
        const { persons } = this.state;
        const p = { id: persons.length + 1, name: "小王", age: 20 };
        this.setState = { persons: [p, ...persons] };
        //  { name: 123 }
      };
      render() {
        return (
          <div>
            <h2>展示人员信息</h2>
            <button onClick={this.add}>添加一个小王</button>
            <h3>使用index索引值作为key</h3>
            <ul>
              {this.state.persons.map((personObj, index) => {
                return <li key={index}>{personObj.name}</li>;
              })}
            </ul>
            <hr />
            <hr />
            <h3>使用id(数据的唯一标识)作为key</h3>
            <ul>
              {this.state.persons.map((personObj) => {
                return <li key={personObj.id}>{personObj.name}</li>;
              })}
            </ul>
          </div>
        );
      }
    }
    //渲染组件到页面
    ReactDOM.render(<Person />, document.getElementById("test"));
  </script>
</html>
